package com.oa.controller;


import com.alibaba.fastjson.JSON;
import com.oa.bean.PageInfo;
import com.oa.bean.User;
import com.oa.dao.UserDao;
import com.oa.service.UserService;
import com.oa.service.UserServiceImpl;

import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

//使用UserController来接收和处理user模块的所有请求操作
//目的：一个请求处理类映射多个uri
@WebServlet(urlPatterns = {"/checkRole", "/loginUser","/logout", "/deleteUser", "/queryUser", "/insertUser", "/toUpdateUser", "/updateUser"})
@MultipartConfig //支持文件上传的注解
public class UserServlet extends HttpServlet {

    //获取业务层接口的对象
    UserService userService = new UserServiceImpl();

    //doGet方法是用于接收get请求的
    @Override   //          request  请求对象           response  响应对象
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置响应类型为json形式的数据--以及设置响应的字符集编码
        response.setContentType("application/json");
        response.setCharacterEncoding("UTF-8");
        request.setCharacterEncoding("UTF-8");
        //获取请求uri
        String uri = request.getRequestURI();
        if (uri.contains("loginUser")) {
            loginUser(request, response);    //登录请求处理方法
        } else if (uri.contains("queryUser")) {
            queryUser(request, response);     //查询请求处理方法
        } else if (uri.contains("insertUser")) {
            insertUser(request, response);   //添加请求处理方法
        }else if (uri.contains("updateUser")) {
            updateUser(request, response); //修改请求
        } else if (uri.contains("deleteUser")) {
            deleteUser(request, response); //删除请求
        } else if (uri.contains("logout")) {//注销登录
            //1、清除会话数据
            request.getSession().invalidate();
            //2、跳转页面
            response.sendRedirect("/OASystem/login_Emp.html");
        }else if (uri.contains("checkRole")) {//检查角色登录
            checkRole(request, response); //检查角色登录
        }
    }

    //检查角色登录
    protected void checkRole(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //定义一个map集合用于保存返回的键值对数据
        Map map = new HashMap();
        //1、获取数据
        //1、清除会话数据
        Object NowUser = request.getSession().getAttribute("NowUser");
        Object NowEmployee = request.getSession().getAttribute("NowEmployee");
        //2、判断
        if(NowUser!=null){
            map.put("role", "User");
            map.put("nowObject", NowUser);
        }
        if(NowEmployee!=null){
            map.put("role", "Employee");
            map.put("nowObject", NowEmployee);
        }
        //3、进行响应返回
        response.getWriter().print(JSON.toJSONString(map));
    }

    //登录请求处理方法     {isok:操作是否成功,message:操作的提示信息}
    protected void loginUser(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //定义一个map集合用于保存返回的键值对数据
        Map map = new HashMap();
        //1、从请求对象中获取请求参数【登录名、密码】 通过getParameter方法根据key来获取value
        String loginname = request.getParameter("loginname");//没有获取到该数据则为null
        String password = request.getParameter("password");
        //2、进行登录校验\做一个非空判断
        if (loginname == null || loginname.equals("")) {
            map.put("isok",false);
            map.put("message", "登录名不能为空！");
            response.getWriter().print(JSON.toJSONString(map));
            //结束方法
            return ;
        }
        if (password == null || password.equals("")) {
            map.put("isok",false);
            map.put("message", "密码不能为空！");
            response.getWriter().print(JSON.toJSONString(map));
            //结束方法
            return;
        }
        //controller调用业务层的方法进行登录查询
        User loginUser = userService.queryUserLogin(loginname, password);
        //校验
        if (loginUser != null) {//表示登录成功--有该用户数据
            //3、进行响应--成功--跳转到首页
            //将信息保存在cookie中    URLEncoder编码器
            Cookie roleCookie = new Cookie("roleCookie","User");
            Cookie objCookie = new Cookie("objCookie", URLEncoder.encode(JSON.toJSONString(loginUser),"UTF-8"));
            response.addCookie(roleCookie);
            response.addCookie(objCookie);

            request.getSession().setAttribute("NowUser", loginUser);
            map.put("isok",true);
            response.getWriter().print(JSON.toJSONString(map));
        } else {
            //3、进行响应--失败--跳转到登录页面
            map.put("isok",false);
            map.put("message", "用户名或密码错误！");
            response.getWriter().print(JSON.toJSONString(map));
        }
    }

    //删除请求处理方法
    protected void deleteUser(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //定义一个map集合用于保存返回的键值对数据
        Map map = new HashMap();
        //1、从请求对象中获取请求参数 通过getParameter方法根据key来获取value
        String str_id = request.getParameter("id");
        int id = Integer.parseInt(str_id);//转换为int类型
        //2、调用业务层方法实现功能
        boolean isok = userService.deleteUser(id);
        if(isok){
            map.put("isok",true);
            //3、作出响应
            response.getWriter().print(JSON.toJSONString(map));
        }else{
            map.put("isok",false);
            map.put("message", "删除失败，请重新操作！");
            //3、作出响应
            response.getWriter().print(JSON.toJSONString(map));
        }
    }

    //修改请求处理方法
    protected void updateUser(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //定义一个map集合用于保存返回的键值对数据
        Map map = new HashMap();
        //1、从请求对象中获取请求参数 通过getParameter方法根据key来获取value
        String str_id = request.getParameter("id");
        int id = Integer.parseInt(str_id);//转换为int类型
        String loginname = request.getParameter("loginname");//没有获取到该数据则为null
        String password = request.getParameter("password");
        String str_status = request.getParameter("status");
        int status = Integer.parseInt(str_status);//转换为int类型
        String username = request.getParameter("username");
        //创建user对象将数据进行封装
        User user = new User();
        user.setId(id);
        user.setUsername(username);
        user.setPassword(password);
        user.setLoginname(loginname);
        user.setStatus(status);
        //获取文件区域的对象数据
        Part filepart = request.getPart("filepart");
        //2、调用业务层方法实现功能
        boolean isok = userService.updateUser(user, filepart);
        //3、作出响应--跳转页面
        if (isok) {//成功则重新查询数据
            map.put("isok", true);
            response.getWriter().print(JSON.toJSONString(map));
        } else {//失败跳转回到修改页面
            map.put("isok", false);
            map.put("message", "修改操作失败，请重新尝试！");
            response.getWriter().print(JSON.toJSONString(map));
        }
    }

    //查询请求处理方法
    protected void queryUser(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //定义一个map集合用于保存返回的键值对数据
        Map map = new HashMap();
        //获取跳转页面
        String pn = request.getParameter("pn");
        String str_pageSize = request.getParameter("pageSize");
        int pageNo = 1,pageSize=4;
        if(pn!=null){
            pageNo = Integer.parseInt(pn);
        }
        if(str_pageSize!=null){
            pageSize = Integer.parseInt(str_pageSize);
        }
        //获取查询的name数据search
        String search = request.getParameter("search")==null?"":request.getParameter("search");

        //创建分页的对象
        PageInfo page = new PageInfo(pageNo,UserDao.queryUserCount(search), pageSize);
        //1、调用业务层方法查询数据
        List<User> userList = userService.queryUser(page,search);
        //2、保存数据到属性作用域中
        map.put("userList", userList);
        map.put("pageInfo", page);
        System.out.println(JSON.toJSONString(map));
        response.getWriter().print(JSON.toJSONString(map));
    }

    //添加请求处理方法
    protected void insertUser(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //定义响应的map集合对象
        Map map = new HashMap();
        //1、从请求对象中获取请求参数 通过getParameter方法根据key来获取value
        String loginname = request.getParameter("loginname");//没有获取到该数据则为null
        String password = request.getParameter("password");
        String str_status = request.getParameter("status");
        int status = Integer.parseInt(str_status);//转换为int类型
        String username = request.getParameter("username");
        //创建user对象将数据进行封装
        User user = new User();
        user.setUsername(username);
        user.setPassword(password);
        user.setLoginname(loginname);
        user.setStatus(status);
        //获取文件区域的对象数据
        Part filepart = request.getPart("filepart");
        //2、调用业务层方法实现功能
        boolean isok = userService.insertUser(user, filepart);
        //3、作出响应--跳转页面
        if (isok) {//成功则跳转到首页
            map.put("isok",true);
            response.getWriter().print(JSON.toJSONString(map));
        } else {//失败跳转回到登录页面
            map.put("isok",false);
            map.put("message", "添加管理员数据失败！");
            response.getWriter().print(JSON.toJSONString(map));
        }
    }

    //doPost方法是用于接收Post请求的
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //调用了上面的doGet，目的是方便操作【不管是get、post都可以在doGet中编写处理代码】
        doGet(request, response);
    }
}
